#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

#define SER_PORT 5003
#define IP_ADDR "172.16.2.55"

int main(int argc, const char *argv[])
{
    struct sockaddr_in addr;
    int sockfd, ret;
    char message[100];
    char buf[100];

    // 第一步：创建socket套接字描述符
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1)
    {
        perror("socket创建失败");
        return -1;
    }

    // 第二步：设置连接的地址和端口号
    memset(&addr, 0, sizeof(addr)); // Initialize addr
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SER_PORT);
    if (inet_pton(AF_INET, IP_ADDR, &addr.sin_addr) <= 0)
    {
        perror("inet_pton失败");
        close(sockfd);
        return -1;
    }

    // 第三步：建立与服务器端的连接
    ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    if (ret == -1)
    {
        perror("connect连接失败");
        close(sockfd);
        return -1;
    }

    /* int flag = fcntl(sockfd, F_GETFL);
    fcntl(sockfd, F_SETFL, flag | SOCK_NONBLOCK); */
    while (1)
    {
        // 客户端给服务器端发送消息
        printf("请输入要发送的消息（输入 'exit' 退出）：");
        fgets(message, sizeof(message), stdin);
        // Remove newline character from the end of the input
        message[strcspn(message, "\n")] = 0;

        if (strcmp(message, "exit") == 0)
        {
            break;
        }

        send(sockfd, message, strlen(message), 0);

        // 接收来自服务器的信息
        memset(buf, 0, sizeof(buf));

        ssize_t n = read(sockfd, buf, sizeof(buf) - 1);
        if (n < 0)
        {
            perror("read失败");
            break;
        }
        buf[n] = '\0'; // Null-terminate the string
        printf("客户端接收到来自服务器端的信息：%s\n", buf);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}